#include "music.h"

Music::Music()
    :isLike(false),
     isHistory(false)
{

}

Music::Music(const QUrl url)
    :isLike(false),
     isHistory(false),
     musicUrl(url)
{
    musicId = QUuid::createUuid().toString();//生成全局唯一的标识码
    parseMediaMetaData();//解析
}

void Music::setMusicId(const QString &musicId)
{
    this->musicId = musicId;
}

void Music::setMusicName(const QString &musicName)
{
    this->musicName = musicName;
}

void Music::setMusicSinger(const QString &musicSinger)
{
    this->musicSinger = musicSinger;
}

void Music::setMusicAlbum(const QString &musicAlbumn)
{
    this->musicAlbumn = musicAlbumn;
}

void Music::setMusicDuration(qint64 duration)
{
    this->duration = duration;
}

void Music::setIsLike(bool isLike)
{
    this->isLike = isLike;
}

void Music::setIsHistory(bool isHistory)
{
    this->isHistory = isHistory;
}

void Music::setMusicUrl(QUrl musicUrl)
{
    this->musicUrl = musicUrl;
}

QString Music::getMusicName() const
{
    return  musicName;
}

QString Music::getMusicSinger() const
{
    return musicSinger;
}

QString Music::getMusicAlbum() const
{
    return musicAlbumn;
}

qint64 Music::getMusicDuration() const
{
    return duration;
}

bool Music::getIsLike() const
{
    return isLike;
}

bool Music::getIsHistory() const
{
    return isHistory;
}

QUrl Music::getMusicUrl() const
{
    return musicUrl;
}

QString Music::getMusicId() const
{
    return musicId;
}

void Music::parseMediaMetaData()
{
    QMediaPlayer player;

    player.setMedia(musicUrl);//提供了一个Url的单参构造
    //媒体元数据解析需要时间，只有等待解析完成之后，才能提取音乐消息，此处循环等待
    while(!player.isMetaDataAvailable())
    {
        QCoreApplication::processEvents();//防止主界面消息循环导致其他事件无法被处理
    }

    if(player.isMetaDataAvailable())
    {
        musicName = player.metaData("Title").toString();
        musicSinger = player.metaData("Author").toString();
        musicAlbumn = player.metaData("AlbumTitle").toString();
        duration = player.duration();

        //为了防止可能有的歌曲并没有这些消息，我们还需要自己处理一下
        QString fileName = musicUrl.fileName();
        int index = fileName.indexOf('-');//Qt中使用indexOf寻找
        //一般歌曲的命名格式为：xxx - yyy.zzz  前面是歌曲名，后面为歌曲作者 最后为格式名
        //当然也有没有作者的 xxx.zzz
        //一般不会没有歌曲名，下载歌曲都是有目的，没有名字你都不知道这是什么歌
        if(musicName.isEmpty())
        {
            if(index != -1)
            {
                //xxx - yyy.zzz
                musicName = fileName.mid(0,index).trimmed();
                //Qt中的substr trimmed的作用为去除前导和后导空格
            }
            else
            {
                //xxx.zzz
                musicName = fileName.mid(0,fileName.indexOf('.')).trimmed();
            }
        }

        if(musicSinger.isEmpty())
        {
            if(index!=-1)
            {
                musicSinger = fileName.mid(index+1,fileName.indexOf('.')-index-1).trimmed();
            }
            else
            {
                musicSinger = "未知歌手";
            }
        }
        if(musicAlbumn.isEmpty())
        {
            musicAlbumn = "未知专辑";
        }
        qDebug()<<fileName<<musicSinger<<":"<<musicAlbumn<<":"<<duration;
    }
}
